{
 "cells": [
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "# 处理中文，并使用jieba分词"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 7,
   "metadata": {},
   "outputs": [],
   "source": [
    "from sentence_transformers import SentenceTransformer\n",
    "from hdbscan import HDBSCAN\n",
    "from sklearn.feature_extraction.text import CountVectorizer\n",
    "from bertopic import BERTopic\n",
    "import jieba"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 8,
   "metadata": {},
   "outputs": [],
   "source": [
    "sentences = [\n",
    "    \"今天的天气晴朗，天空湛蓝。\",\n",
    "    \"明天的预报预测将有大雨和雷暴。\",\n",
    "    \"我喜欢在温和的天气下观看日落。\",\n",
    "    \"自然语言处理是计算机科学的一个研究领域。\",\n",
    "    \"NLP技术被广泛用于文本分析和语言理解。\",\n",
    "    \"天气预报依赖于复杂的算法和数据分析。\",\n",
    "    \"了解天气模式对农业和灾害管理至关重要。\",\n",
    "    \"NLP算法可以帮助分析社交媒体帖子的情感。\",\n",
    "    \"天气可能会变化无常，尤其是在季节交替时。\",\n",
    "    \"像BERT和GPT-3这样的NLP模型已经彻底改变了语言理解任务。\",\n",
    "    \"极端天气事件如飓风和龙卷风需要先进的预测模型。\",\n",
    "    \"NLP被用于像Siri和Alexa这样的虚拟助手，以理解人类命令。\",\n",
    "    \"气候变化正在影响全球的天气模式。\",\n",
    "    \"NLP可以帮助进行机器翻译，使跨语言交流变得更容易。\",\n",
    "    \"气象卫星提供实时数据供气象学家分析。\",\n",
    "    \"语义分析是自然语言处理的重要组成部分。\",\n",
    "    \"天气现象如厄尔尼诺影响着全球的天气。\",\n",
    "    \"词性标注是NLP中的一个基本任务。\",\n",
    "    \"沿海地区的天气常受海洋洋流影响。\",\n",
    "    \"NLP有助于聊天机器人生成类似人类的回复。\"\n",
    "]"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "https://maartengr.github.io/BERTopic/api/bertopic.html\n",
    "The default embedding model is all-MiniLM-L6-v2 when selecting language=\"english\" and paraphrase-multilingual-MiniLM-L12-v2 when selecting language=\"multilingual\"."
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "# 使用能处理中文的词嵌入模型"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 9,
   "metadata": {},
   "outputs": [],
   "source": [
    "embedding_model = SentenceTransformer(\"paraphrase-multilingual-MiniLM-L12-v2\")\n",
    "hdbscan_model = HDBSCAN(min_cluster_size=2)"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "# 使用jieba分词\n",
    "https://maartengr.github.io/BERTopic/faq.html#how-can-i-use-bertopic-with-chinese-documents\n",
    "How can I use BERTopic with Chinese documents?\n",
    "Currently, CountVectorizer tokenizes text by splitting whitespace which does not work for Chinese. To get it to work, you will have to create a custom CountVectorizer with jieba:\n",
    "\n",
    "\n",
    "from sklearn.feature_extraction.text import CountVectorizer\n",
    "import jieba\n",
    "\n",
    "def tokenize_zh(text):\n",
    "    words = jieba.lcut(text)\n",
    "    return words\n",
    "\n",
    "vectorizer = CountVectorizer(tokenizer=tokenize_zh)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 10,
   "metadata": {},
   "outputs": [],
   "source": [
    "def tokenize_zh(text):\n",
    "    words = jieba.lcut(text) # 切词，并返回list\n",
    "    print('切词：', words)\n",
    "    return words\n",
    "\n",
    "vectorizer_model = CountVectorizer(tokenizer=tokenize_zh)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 11,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "切词： ['今天', '的', '天气晴朗', '，', '天空', '湛蓝', '。', ' ', '明天', '的', '预报', '预测', '将', '有', '大雨', '和', '雷暴', '。', ' ', '我', '喜欢', '在', '温和', '的', '天气', '下', '观看', '日落', '。', ' ', '天气预报', '依赖于', '复杂', '的', '算法', '和', '数据分析', '。', ' ', '了解', '天气', '模式', '对', '农业', '和', '灾害', '管理', '至关重要', '。', ' ', '天气', '可能', '会', '变化无常', '，', '尤其', '是', '在', '季节', '交替', '时', '。', ' ', '极端', '天气', '事件', '如', '飓风', '和', '龙卷风', '需要', '先进', '的', '预测', '模型', '。', ' ', '气候变化', '正在', '影响', '全球', '的', '天气', '模式', '。', ' ', '气象卫星', '提供', '实时', '数据', '供', '气象学家', '分析', '。', ' ', '天气现象', '如', '厄尔尼诺', '影响', '着', '全球', '的', '天气', '。', ' ', '沿海地区', '的', '天气', '常受', '海洋', '洋流', '影响', '。']\n",
      "切词： ['自然语言', '处理', '是', '计算机科学', '的', '一个', '研究', '领域', '。', ' ', 'nlp', '技术', '被', '广泛', '用于', '文本', '分析', '和', '语言', '理解', '。', ' ', 'nlp', '算法', '可以', '帮助', '分析', '社交', '媒体', '帖子', '的', '情感', '。', ' ', '像', 'bert', '和', 'gpt', '-', '3', '这样', '的', 'nlp', '模型', '已经', '彻底改变', '了', '语言', '理解', '任务', '。', ' ', 'nlp', '被', '用于', '像', 'siri', '和', 'alexa', '这样', '的', '虚拟', '助手', '，', '以', '理解', '人类', '命令', '。', ' ', 'nlp', '可以', '帮助', '进行', '机器翻译', '，', '使', '跨', '语言', '交流', '变得', '更', '容易', '。', ' ', '语义', '分析', '是', '自然语言', '处理', '的', '重要', '组成部分', '。', ' ', '词性', '标注', '是', 'nlp', '中', '的', '一个', '基本', '任务', '。', ' ', 'nlp', '有助于', '聊天', '机器人', '生成', '类似', '人类', '的', '回复', '。']\n",
      "切词： ['今天', '的', '天气晴朗', '，', '天空', '湛蓝', '。', ' ', '明天', '的', '预报', '预测', '将', '有', '大雨', '和', '雷暴', '。', ' ', '我', '喜欢', '在', '温和', '的', '天气', '下', '观看', '日落', '。', ' ', '天气预报', '依赖于', '复杂', '的', '算法', '和', '数据分析', '。', ' ', '了解', '天气', '模式', '对', '农业', '和', '灾害', '管理', '至关重要', '。', ' ', '天气', '可能', '会', '变化无常', '，', '尤其', '是', '在', '季节', '交替', '时', '。', ' ', '极端', '天气', '事件', '如', '飓风', '和', '龙卷风', '需要', '先进', '的', '预测', '模型', '。', ' ', '气候变化', '正在', '影响', '全球', '的', '天气', '模式', '。', ' ', '气象卫星', '提供', '实时', '数据', '供', '气象学家', '分析', '。', ' ', '天气现象', '如', '厄尔尼诺', '影响', '着', '全球', '的', '天气', '。', ' ', '沿海地区', '的', '天气', '常受', '海洋', '洋流', '影响', '。']\n",
      "切词： ['自然语言', '处理', '是', '计算机科学', '的', '一个', '研究', '领域', '。', ' ', 'nlp', '技术', '被', '广泛', '用于', '文本', '分析', '和', '语言', '理解', '。', ' ', 'nlp', '算法', '可以', '帮助', '分析', '社交', '媒体', '帖子', '的', '情感', '。', ' ', '像', 'bert', '和', 'gpt', '-', '3', '这样', '的', 'nlp', '模型', '已经', '彻底改变', '了', '语言', '理解', '任务', '。', ' ', 'nlp', '被', '用于', '像', 'siri', '和', 'alexa', '这样', '的', '虚拟', '助手', '，', '以', '理解', '人类', '命令', '。', ' ', 'nlp', '可以', '帮助', '进行', '机器翻译', '，', '使', '跨', '语言', '交流', '变得', '更', '容易', '。', ' ', '语义', '分析', '是', '自然语言', '处理', '的', '重要', '组成部分', '。', ' ', '词性', '标注', '是', 'nlp', '中', '的', '一个', '基本', '任务', '。', ' ', 'nlp', '有助于', '聊天', '机器人', '生成', '类似', '人类', '的', '回复', '。']\n",
      "切词： ['极端', '天气', '事件', '如', '飓风', '和', '龙卷风', '需要', '先进', '的', '预测', '模型', '。']\n",
      "切词： ['天气预报', '依赖于', '复杂', '的', '算法', '和', '数据分析', '。']\n",
      "切词： ['沿海地区', '的', '天气', '常受', '海洋', '洋流', '影响', '。']\n",
      "切词： ['气候变化', '正在', '影响', '全球', '的', '天气', '模式', '。']\n",
      "切词： ['了解', '天气', '模式', '对', '农业', '和', '灾害', '管理', '至关重要', '。']\n",
      "切词： ['天气现象', '如', '厄尔尼诺', '影响', '着', '全球', '的', '天气', '。']\n",
      "切词： ['我', '喜欢', '在', '温和', '的', '天气', '下', '观看', '日落', '。']\n",
      "切词： ['天气', '可能', '会', '变化无常', '，', '尤其', '是', '在', '季节', '交替', '时', '。']\n",
      "切词： ['明天', '的', '预报', '预测', '将', '有', '大雨', '和', '雷暴', '。']\n",
      "切词： ['今天', '的', '天气晴朗', '，', '天空', '湛蓝', '。']\n",
      "切词： ['气象卫星', '提供', '实时', '数据', '供', '气象学家', '分析', '。']\n",
      "切词： ['nlp', '技术', '被', '广泛', '用于', '文本', '分析', '和', '语言', '理解', '。']\n",
      "切词： ['nlp', '算法', '可以', '帮助', '分析', '社交', '媒体', '帖子', '的', '情感', '。']\n",
      "切词： ['nlp', '有助于', '聊天', '机器人', '生成', '类似', '人类', '的', '回复', '。']\n",
      "切词： ['语义', '分析', '是', '自然语言', '处理', '的', '重要', '组成部分', '。']\n",
      "切词： ['像', 'bert', '和', 'gpt', '-', '3', '这样', '的', 'nlp', '模型', '已经', '彻底改变', '了', '语言', '理解', '任务', '。']\n",
      "切词： ['nlp', '被', '用于', '像', 'siri', '和', 'alexa', '这样', '的', '虚拟', '助手', '，', '以', '理解', '人类', '命令', '。']\n",
      "切词： ['词性', '标注', '是', 'nlp', '中', '的', '一个', '基本', '任务', '。']\n",
      "切词： ['自然语言', '处理', '是', '计算机科学', '的', '一个', '研究', '领域', '。']\n",
      "切词： ['nlp', '可以', '帮助', '进行', '机器翻译', '，', '使', '跨', '语言', '交流', '变得', '更', '容易', '。']\n"
     ]
    },
    {
     "data": {
      "text/html": [
       "<div>\n",
       "<style scoped>\n",
       "    .dataframe tbody tr th:only-of-type {\n",
       "        vertical-align: middle;\n",
       "    }\n",
       "\n",
       "    .dataframe tbody tr th {\n",
       "        vertical-align: top;\n",
       "    }\n",
       "\n",
       "    .dataframe thead th {\n",
       "        text-align: right;\n",
       "    }\n",
       "</style>\n",
       "<table border=\"1\" class=\"dataframe\">\n",
       "  <thead>\n",
       "    <tr style=\"text-align: right;\">\n",
       "      <th></th>\n",
       "      <th>Topic</th>\n",
       "      <th>Count</th>\n",
       "      <th>Name</th>\n",
       "      <th>Representation</th>\n",
       "      <th>Representative_Docs</th>\n",
       "    </tr>\n",
       "  </thead>\n",
       "  <tbody>\n",
       "    <tr>\n",
       "      <th>0</th>\n",
       "      <td>0</td>\n",
       "      <td>11</td>\n",
       "      <td>0_。_天气_ _的</td>\n",
       "      <td>[。, 天气,  , 的, 和, 影响, 在, 全球, 如, 模式]</td>\n",
       "      <td>[极端天气事件如飓风和龙卷风需要先进的预测模型。, 气候变化正在影响全球的天气模式。, 天气...</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>1</th>\n",
       "      <td>1</td>\n",
       "      <td>9</td>\n",
       "      <td>1_nlp_。_ _的</td>\n",
       "      <td>[nlp, 。,  , 的, 语言, 理解, 分析, 是, 和, 处理]</td>\n",
       "      <td>[NLP技术被广泛用于文本分析和语言理解。, NLP被用于像Siri和Alexa这样的虚拟助...</td>\n",
       "    </tr>\n",
       "  </tbody>\n",
       "</table>\n",
       "</div>"
      ],
      "text/plain": [
       "   Topic  Count         Name                        Representation  \\\n",
       "0      0     11   0_。_天气_ _的    [。, 天气,  , 的, 和, 影响, 在, 全球, 如, 模式]   \n",
       "1      1      9  1_nlp_。_ _的  [nlp, 。,  , 的, 语言, 理解, 分析, 是, 和, 处理]   \n",
       "\n",
       "                                 Representative_Docs  \n",
       "0  [极端天气事件如飓风和龙卷风需要先进的预测模型。, 气候变化正在影响全球的天气模式。, 天气...  \n",
       "1  [NLP技术被广泛用于文本分析和语言理解。, NLP被用于像Siri和Alexa这样的虚拟助...  "
      ]
     },
     "execution_count": 11,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "# 这里有两个问题\n",
    "# 其一是每次运行模型都会执行切词操作，非常浪费时间\n",
    "# 其二是介词会包含：标点符号、的、了等虚词，这些词更应该被排除在外\n",
    "topic_model = BERTopic(\n",
    "  embedding_model=embedding_model,\n",
    "  hdbscan_model=hdbscan_model,\n",
    "  vectorizer_model=vectorizer_model,\n",
    ")\n",
    "\n",
    "topic_model.fit_transform(sentences) # 训练模型\n",
    "topic_model.get_topic_info() # 获取主题聚类信息"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 12,
   "metadata": {},
   "outputs": [],
   "source": [
    "topic_docs = topic_model.get_document_info(sentences)\n",
    "topic_docs.to_csv('./聚类结果.csv')"
   ]
  }
 ],
 "metadata": {
  "kernelspec": {
   "display_name": "Python 3",
   "language": "python",
   "name": "python3"
  },
  "language_info": {
   "codemirror_mode": {
    "name": "ipython",
    "version": 3
   },
   "file_extension": ".py",
   "mimetype": "text/x-python",
   "name": "python",
   "nbconvert_exporter": "python",
   "pygments_lexer": "ipython3",
   "version": "3.10.6"
  }
 },
 "nbformat": 4,
 "nbformat_minor": 2
}
